#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include <QTableWidget>
#include <QPushButton>
#include <QSplitter>
#include <QTabWidget>
#include <QStatusBar>
#include <QMenuBar>
#include <QToolBar>
#include <QLabel>
#include <QTimer>
#include <QFileDialog>
#include <QMessageBox>
#include <QSettings>
#include <QCloseEvent>
#include <QProgressBar>
#include <QSet>
#include <memory>

// 包含必要的头文件
#include "systemCallHandler.h"

// 前向声明
class CpuSimulator;
class InterruptManager;
enum class CpuState;
struct Instruction;

QT_BEGIN_NAMESPACE
class QAction;
class QMenu;
QT_END_NAMESPACE

/**
 * @brief 主窗口类
 * 
 * 应用程序的主窗口，提供汇编代码编辑、程序执行控制、
 * 寄存器和内存监视等功能。
 */
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow() override;

protected:
    /**
     * @brief 关闭事件处理
     * @param event 关闭事件
     */
    void closeEvent(QCloseEvent *event) override;

private slots:
    // 文件操作
    void onNewFile();
    void onOpenFile();
    void onSaveFile();
    void onSaveAsFile();
    void onExit();

    // 程序执行控制
    void onRunProgram();
    void onStepExecution();
    void onPauseProgram();
    void onStopProgram();
    void onResetCpu();

    // 编辑操作
    void onUndo();
    void onRedo();
    void onCut();
    void onCopy();
    void onPaste();
    void onFind();
    void onReplace();

    // 调试操作
    void onToggleBreakpoint();
    void onClearAllBreakpoints();
    void onViewMemory();
    void onViewInterruptStatistics();

    // 帮助和示例
    void onLoadExample();
    void onShowHelp();
    void onAbout();

    // CPU状态更新
    void onCpuStateChanged(CpuState newState);
    void onRegisterChanged(const QString& registerName, int newValue);
    void onMemoryChanged(int address, int newValue);
    void onInstructionExecuted(const Instruction& instruction);
    void onCpuError(const QString& errorMessage);

    // 中断处理
    void onInterruptHandled(int interruptNumber, const SystemCallResult& result);
    void onInterruptError(int interruptNumber, const QString& errorMessage);
    void onOutputMessage(const QString& message);

    // 界面更新
    void updateStatusBar();
    void updateToolbarActions();
    void updateToolbarActions(CpuState currentState);
    void onTabChanged(int index);
    void onTextChanged();

private:
    // 界面初始化
    void setupUi();
    void createMenus();
    void createToolBars();
    void createStatusBar();
    void createCentralWidget();
    void connectSignals();

    // 控件创建
    QWidget* createCodeEditor();
    QWidget* createRegisterView();
    QWidget* createMemoryView();
    QWidget* createOutputView();
    QWidget* createInstructionView();

    // 数据更新
    void updateRegisterView();
    void updateMemoryView();
    void updateInstructionView();
    void highlightCurrentInstruction();

    // 文件操作辅助
    bool saveToFile(const QString& fileName);
    bool loadFromFile(const QString& fileName);
    bool maybeSave();
    void setCurrentFile(const QString& fileName);
    QString strippedName(const QString& fullFileName);

    // 示例代码
    void loadSampleCode();
    QString getSampleCode() const;

    // 设置和配置
    void readSettings();
    void writeSettings();
    void applySettings();

    // 错误处理辅助
    void clearErrorState();
    bool shouldShowErrorDialog(const QString& errorMessage);

private:
    // 核心组件
    std::unique_ptr<CpuSimulator> cpuSimulator;
    std::unique_ptr<InterruptManager> interruptManager;

    // 主界面组件
    QTabWidget* mainTabWidget;
    QSplitter* mainSplitter;
    QSplitter* rightSplitter;

    // 代码编辑器
    QTextEdit* codeEditor;
    QTableWidget* instructionTable;

    // 寄存器和内存视图
    QTableWidget* registerTable;
    QTableWidget* memoryTable;

    // 输出视图
    QTextEdit* outputTextEdit;
    QTextEdit* logTextEdit;

    // 菜单
    QMenu* fileMenu;
    QMenu* editMenu;
    QMenu* runMenu;
    QMenu* debugMenu;
    QMenu* helpMenu;

    // 工具栏
    QToolBar* fileToolBar;
    QToolBar* editToolBar;
    QToolBar* runToolBar;

    // 菜单动作
    QAction* newAct;
    QAction* openAct;
    QAction* saveAct;
    QAction* saveAsAct;
    QAction* exitAct;

    QAction* undoAct;
    QAction* redoAct;
    QAction* cutAct;
    QAction* copyAct;
    QAction* pasteAct;
    QAction* findAct;
    QAction* replaceAct;

    QAction* runAct;
    QAction* stepAct;
    QAction* pauseAct;
    QAction* stopAct;
    QAction* resetAct;

    QAction* toggleBreakpointAct;
    QAction* clearBreakpointsAct;
    QAction* viewMemoryAct;
    QAction* viewStatsAct;

    QAction* loadExampleAct;
    QAction* helpAct;
    QAction* aboutAct;

    // 状态栏组件
    QLabel* statusLabel;
    QLabel* cpuStateLabel;
    QLabel* instructionCountLabel;
    QLabel* memoryUsageLabel;
    QProgressBar* executionProgress;

    // 定时器
    QTimer* statusUpdateTimer;

    // 状态变量
    QString currentFileName;
    bool isModified;
    int currentInstructionIndex;
    bool isExecuting;

    // 配置参数
    QFont codeEditorFont;
    bool autoSaveEnabled;
    int memoryViewSize;
    bool showLineNumbers;

    // 错误处理状态
    QString lastErrorMessage;
    int consecutiveErrorCount;
    QTimer* errorClearTimer;
};

#endif // MAINWINDOW_H 